package cn.tedu.oopextends;
/**本类用于测试继承中构造方法的使用*/
public class TestCons {
    public static void main(String[] args) {
//        Father f=new Father();
//        Sun s=new Sun();/**调用子类结构方法前会首先调用父类的无参构造，在父类无参构造调用前会先使用结构函数进行初始化*/
//        Sun s1=new Sun("大头儿子");
        Sun s=new Sun();
        Father f=new Father();
        f.eat();
        s.eat();
        s.play();
        new  Father();


    }
}
/**OCP原则：面向功能修改关闭，面向功能拓展开放
 * 比如重写，我们要在不修改父类方法的前提下，实现功能的更新*/
class Father{
    public Father() {
        System.out.println("父类的无参构造");
    }
    public Father(int n) {
        System.out.println("父类的含参构造");
    }

    public void eat(){
        System.out.println("爸爸爱吃肉");
    }

    public void play(){
        System.out.println("爱放风筝");
    }
    public static void eat1(){
        System.out.println("都爱吃鱼");
    }
//    static {
//        System.out.println("父类的静态类初始化");
//    }
    {
        System.out.println("父类的结构代码块");
    }
}
/**构造方法不可以被继承！由于构造方法的语法的限制的
 * 构造方法要求方法名是本类类名*/
class Sun extends Father{
    /**子类创建对象时，会默认调用父类的构造方法
     * 子类构造方法中的第一行，默认存super();-调用父类的无参构造*/
    @Override/**注解，小标记/标签 用于标记这是一个重写的方法*/
    public void eat(){
        System.out.println("儿子爱吃菜");
    }
    @Override
    public void play(){
        System.out.println("儿子爱玩游戏");
    }
    public void work(){
        System.out.println("我们都是程序员");
    }
    public static void eat2(){
        System.out.println("我们都爱吃馒头");
    }
    /**方法的重写:j继承之后，子类对父类的方法不满意，可以重写
     * 儿子类可以拥有自己的特有功能--新功能
     * 方法重写的规则：两同 两小 一大原则
     * 两同：方法名与参数列表(方法签名)保持一致
     * 两小：子类的返回值类型<=父类的返回值类型，
     *              子类方法抛出的异常类型<=父类方法抛出的异常类型
     * 一大：子类方法的修饰符要>=父类方法的修饰符*/
    public Sun(){
        /**子类创建对象时，要先调用父类的构造方法
         * 至于调用的是父类的那种构造，并不关心，只要父类有构造调用就可以*/
        super();
        System.out.println("子类的无参构造");
    }
    public Sun(String s) {
        super();
        System.out.println("子类的含参构造"+s);
    }
//    static {
//        System.out.println("子类的静态类初始化");
//    }
    {
        System.out.println("子类的结构代码块");
    }
}